<?php

/**
 * Message form.
 *
 * @package    ti
 * @subpackage form
 * @author     Evgeny Babin <psylosss@gmail.com>
 * @version    SVN: $Id: sfDoctrineFormTemplate.php 23810 2009-11-12 11:07:44Z Kris.Wallsmith $
 */
class MessageForm extends BaseMessageForm
{
  public function configure()
  {
    unset($this['created_at'],$this['updated_at'],$this['user_id']);
    
    if ($this->isNew())
      unset($this['id']);
    
    $this->ticket=$this->getOption('ticket',new Ticket());
    
    $this->widgetSchema['ticket_id']=new sfWidgetFormInputHidden();
    
    
    
    //Виджет видимости сообщения пользователям
    //Сообщение может быть видно только тому, кому одновременно виден тикет, и с кем данному пользователю разрешено общаться. То же самое с ответственным
    $users_choices=array();
    $q=sfContext::getInstance()->getUser()->getGuardUser()->Profile->getAvailableInteractUsersQuery($this->ticket->Project->id);
    $users_available=$q->execute();
    $ticket_visible_to_users_ids=$this->ticket->VisibleToUsers->getPrimaryKeys();
    foreach ($users_available as $user)
    {
      if (in_array($user->id,$ticket_visible_to_users_ids))
        $users_choices[$user->id]=$user->username.' ('.$user->Profile->fullname.')';
    }
    
    
    //Если вообще есть кому поручить тикет (кроме себя самого), то выводим виджеты. Иначе - нет.
    if (count($users_choices))
    {
      $this->widgetSchema['visible_to_users_list']=new sfWidgetFormChoice(array(
        'multiple'=>true,
        'choices'=>$users_choices,
        'expanded'=>true,
      ));
      $this->validatorSchema['visible_to_users_list']=new sfValidatorChoice(array(
        'multiple'=>true,
        'choices'=>array_keys($users_choices),
        'required'=>false,
      ));
      
      
      //Виджет смены ответственного за тикет
      $users_choices=array(
        ''=>'Не менять ('.$this->ticket->CurrentUser->User->username.')',
        sfContext::getInstance()->getUser()->getGuardUser()->Profile->id=>'[Я]',
      );
      
      foreach ($users_available as $user)
      {
        if (in_array($user->id,$ticket_visible_to_users_ids))
          $users_choices[$user->id]=$user->username.' ('.$user->Profile->fullname.')';
      }
      
      
      $this->widgetSchema['current_user_id']=new sfWidgetFormChoice(array(
        'choices'=>$users_choices,
        'multiple'=>false,
      ));
      $this->validatorSchema['current_user_id']=new sfValidatorChoice(array(
        'choices'=>array_keys($users_choices),
        'multiple'=>false,
        'required'=>false,
      ));
    }
    else
    {
      unset($this['current_user_id'],$this['visible_to_users_list']);
    }
    
    
    
    //Тест сообщения не обязательно вводить: возможно, происходит просто смена ответственного
    $this->validatorSchema['text']->setOption('required',false);
    
    
    
    $this->widgetSchema->setLabels(array(
      'text'=>'Сообщение',
      'visible_to_users_list'=>'Видно пользователям',
      'current_user_id'=>'Ответственный',
    ));
  }
  
  
  function processValues($values)
  {
    //принудительно привязываем к тикету, к которому писали ответ. Вне зависимости от того, что было передано в форме
    $values['ticket_id']=$this->ticket->id;
    
    //Если изменяется ответственный, то создается системное сообщение
    if (!empty($values['current_user_id']) and $this->ticket->CurrentUser->id != $values['current_user_id'])
    {
      $current_user=Doctrine::getTable('sfGuardUserProfile')->find($values['current_user_id']);
      $values['text'].="\n\n".'Изменяю ответственного за тикет: '.$this->ticket->CurrentUser->fullname.' ('.$this->ticket->CurrentUser->User->username.') --> '.$current_user->fullname.' ('.$current_user->User->username.').';
    }
    else
    {
      
    }
    
    return parent::processValues($values);
  }
  
  function save($conn=null)
  {
    parent::save($conn);
    
    $ticket=clone $this->ticket;
    
    //Меняем дату изменения тикета
    $ticket->updated_at=date('Y-m-d H:i:s');
    
    //Изменяем ответственного за тикет
    if ($current_user_id=$this->getValue('current_user_id'))
    {
      $ticket->current_user_id=$current_user_id;
    }
    
    $ticket->save();
    
  }
    
  function doUpdateObject($values)
  {    
    //Записываем автора сообщения
    $values['user_id']=sfContext::getInstance()->getUser()->getGuardUser()->id;
    
    parent::doUpdateObject($values);
  }
  
  function doSave($conn=null)
  {
    parent::doSave($conn);
    
    //Записываем, что сообщение может быть видно самому себе
    $this->getObject()->link('VisibleToUsers',$this->getObject()->user_id,true);
  }
  
  
  
}
